#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/wait.h>
#include<cstdlib>
#include<string.h>
#include<errno.h>
#include<iostream>

// int main()
// {
//     printf("我是进程：%d\n",getpid());

//     pid_t id = fork();
//     if(id == 0)
//     {
//         printf("我是子进程：%d\n",getpid());
//     }
//     else
//     {
//         printf("我是父进程：%d\n",getpid());
//     }
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         printf("我是子进程：%d,我的父进程是：%d\n",getpid(),getppid());
//         printf("执行子进程专属代码");
//         sleep(3);
//     }
//     else if(id > 0)
//     {
//         printf("我是父进程：%d,我的子进程是：%d\n",getpid(),id);
//         printf("执行父进程专属代码");
//         sleep(1);
//     }
//     else
//     {
//         printf("fork失败\n");
//     }
//     return 0;
// }

// int main()
// {
//     pid_t pid = fork();
//     if (pid == 0) 
//     {
//     // 子进程加载新程序
//     execl("/bin/ls", "ls", "-l", NULL);
//     // 若exec失败才会执行以下代码
//     perror("exec failed");

//     _exit(EXIT_FAILURE);  // 必须用_exit避免刷新父进程缓冲区

//     } 
//     else if (pid > 0) 
//     {
//         // 父进程继续执行原程序
//         waitpid(pid, NULL, 0); 
//         printf("子进程已退出\n");
//     }
//     return 0;
// }


// int main()
// {
//     printf("你好，这是一个打印");
//     //exit(0);
//     _exit(0);
// }

// int main()
// {
//     //打开文件前的错误信息
//     printf("errno: %d ,errstring: %s\n",errno,strerror(errno));

//     FILE*fp=fopen("./log.txt","r");

//     if(fp==nullptr)
//     {
//         //打开文件失败后的错误信息
//         printf("errno: %d ,errstring: %s\n",errno,strerror(errno));
//         return errno;
//     }
//     return 0;
// }

// int main()
// {
//     for(int i=1;i<200;++i)
//     {
//         std::cout<<i<<": "<<strerror(i)<<std::endl;
//     }
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt=3;
//         while(cnt--)
//         {
//             printf("子进程运行中：%d\n",getpid());
//             sleep(1);
//         }   
//         exit(123);
//     }
//     else if(id > 0)
//     {
//         //pid_t rid=wait(nullptr);
//         int status;
//         pid_t rid=waitpid(id,&status,0);
//         if(rid>0)
//         {
//             printf("Child %d exited with status %d, signal %d\n",rid, WEXITSTATUS(status), WTERMSIG(status));
//         }
        
//         while(1)
//         {
//             printf("我是父进程：%d\n",getpid());
//             sleep(1);
//         }
//     }
//     else
//     {
//         printf("errno: %d ,errstring: %s\n",errno,strerror(errno));
//         return errno;
//     }
//     return 0;
// }


//阻塞等待
// int main()
// {
//     //如果函数运行成功，返回值id将会是子进程的pid
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt=3;
//         while(cnt--)
//         {
//             printf("子进程运行中：%d\n",getpid());
//             sleep(1);
//         }   
//         exit(0);
//     }
//     else if(id > 0)
//     {
//         //父进程阻塞等待pid为id的子进程
//         waitpid(id,nullptr,0);
//         while(1)
//         {
//             printf("父进程运行中：%d\n",getpid());
//             sleep(1);
//         }
//     }
//     else
//     {
//         printf("errno: %d ,errstring: %s\n",errno,strerror(errno));
//         return errno;
//     }
//     return 0;
// }


// //非阻塞等待
// int main()
// {
//     //如果函数运行成功，返回值id将会是子进程的pid
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt=3;
//         while(cnt--)
//         {
//             printf("子进程运行中：%d\n",getpid());
//             sleep(1);
//         }   
//         exit(0);
//     }
//     else if(id > 0)
//     {
//         //父进程阻塞等待pid为id的子进程
//         int cnt=0;
//         //轮循主体，调用waitpid进行等待
//         while(1)
//         {
//             pid_t rid=waitpid(id,nullptr,WNOHANG);
           
//             sleep(1);

//             if(rid>0)
//             {
//                 printf("等待成功！子进程成功返回！\n");
//                 //退出循环
//                 break;
//             }
//             else if (rid == 0)
//             {
//                 printf("父进程运行中：%d,当前循环次数：%d\n",getpid(),cnt++);
//             }
//             else
//             {
//                 printf("errno: %d ,errstring: %s\n",errno,strerror(errno));
//                 return errno;
//             }
//         }
//         printf("退出轮循，继续完成父进程任务！\n");
//     }
//     else
//     {
//         printf("errno: %d ,errstring: %s\n",errno,strerror(errno));
//         return errno;
//     }
//     return 0;
// }

// int main()
// {
//     execl("/bin/ls","ls","-l","-a",nullptr);
//     return 0;
// }

// int main()
// {
//     printf("我是test,PID为:%d\n",getpid());
//     execl("./other","./other",nullptr);
//     return 0;
// }

// int main()
// {
//     //printf("我是父进程，PID为：%d",getpid());
//     pid_t id=fork();
//     char *const args[] = {(char*)"other", NULL};
//     char *const env[] = {(char*)"PATH=/home/ubuntu/dailycode/进程控制博客代码", NULL};
//     if(id==0)
//     {
//         execvpe("./other",args,env);
//     }
   
//     // if(id==0)
//     // {
//     //     printf("我是子进程，执行execl\n");
//     //     execl("/bin/ls","ls","-l","-a",nullptr);
//     // }
//     return 0;
//}

extern char** environ;
const std::string envvv="PATH=/home/ubuntu/dailycode/进程控制博客代码";
int main()
{
    pid_t id=fork();
    char *const args[] = {(char*)"other", NULL};
    putenv((char*)envvv.c_str());
    if(id==0)
    {
        execvpe("./other",args,environ);
    }
   
    return 0;
}